package com.totoro.tymapping.utils;

import org.apache.commons.jexl3.*;

import java.util.Map;

/**
 * Jexl表达式工具类
 * 仅使用单例JexlEngine，不包含表达式缓存
 */
public class JexlUtil {
    // 单例JexlEngine实例，线程安全
    private static final JexlEngine JEXL_ENGINE = new JexlBuilder()
            .strict(true)  // 严格模式，未定义变量会抛出异常
            .silent(false) // 非静默模式，错误会抛出异常
            .create();

    /**
     * 计算表达式的值，使用默认上下文
     * @param expression 表达式字符串
     * @return 表达式计算结果
     * @throws JexlException 当表达式解析或计算出错时抛出
     */
    public static Object evaluateExpressions(String expression) throws JexlException {
        return evaluateExpressions(expression, new MapContext());
    }

    /**
     * 计算表达式的值，使用传入的上下文参数
     * @param expression 表达式字符串
     * @param context 上下文参数
     * @return 表达式计算结果
     * @throws JexlException 当表达式解析或计算出错时抛出
     */
    public static Object evaluateExpressions(String expression, JexlContext context) throws JexlException {
        if (expression == null || expression.trim().isEmpty()) {
            return null;
        }
        JexlExpression jexlExpr = JEXL_ENGINE.createExpression(expression);
        return jexlExpr.evaluate(context);
    }

    /**
     * 计算表达式的值，使用Map作为上下文参数
     * @param expression 表达式字符串
     * @param params 键值对参数
     * @return 表达式计算结果
     * @throws JexlException 当表达式解析或计算出错时抛出
     */
    public static Object evaluateExpressions(String expression, Map<String, Object> params) throws JexlException {
        if (params == null) {
            return evaluateExpressions(expression);
        }
        JexlContext context = new MapContext();
        params.forEach(context::set);
        return evaluateExpressions(expression, context);
    }
}
